package com.wlc.thread;

import java.util.HashMap;
import java.util.Map;

public class TestThread {

    /**
     * 初始化4个对象
     *
     * @return
     */
    public static Map<String, Hero> initHeros() {
        Map<String, Hero> map = new HashMap<>();
        Hero gareen = new Hero();
        gareen.name = "盖伦";
        gareen.hp = 616;
        gareen.damage = 50;

        Hero teemo = new Hero();
        teemo.name = "提莫";
        teemo.hp = 300;
        teemo.damage = 30;

        Hero bh = new Hero();
        bh.name = "赏金猎人";
        bh.hp = 500;
        bh.damage = 65;

        Hero leesin = new Hero();
        leesin.name = "盲僧";
        leesin.hp = 455;
        leesin.damage = 80;
        map.put("gareen", gareen);
        map.put("teemo", teemo);
        map.put("bh", bh);
        map.put("leesin", leesin);
        return map;
    }

    /**
     * 不实用多线程，只能一个任务接着一个任务执行
     */
    public void method01() {
        Map<String, Hero> map = initHeros();
        Hero gareen = map.get("gareen");
        Hero teemo = map.get("teemo");
        Hero bh = map.get("bh");
        Hero leesin = map.get("leesin");
        //盖伦攻击提莫
        // 只要提莫还没有死亡，盖伦这个英雄就会不断的攻击提莫
        while (!teemo.isDead()) {
            gareen.attackHero(teemo);
        }

        //赏金猎人攻击盲僧
        // 只要盲僧没有死， 赏金猎人就会一直攻击盲僧
        while (!leesin.isDead()) {
            bh.attackHero(leesin);
        }
    }

    /**
     * 使用 多线程的方式 继承Thread 类 ，重写run方法
     * 启动多线程使用start 方法
     */
    public static void method02() {
        Map<String, Hero> map = initHeros();
        // 盖伦攻击提莫
        KillThread killThread = new KillThread(map.get("gareen"), map.get("teemo"));
        killThread.start();
        // 赏金猎人攻击盲僧
        KillThread killThread2 = new KillThread(map.get("bh"), map.get("leesin"));
        killThread2.start();
    }

    /**
     * 使用 实现Runnable 接口的方式  实现多线程
     */
    public static void method03() {
        Map<String, Hero> map = initHeros();
        Battle battle1 = new Battle(map.get("gareen"), map.get("teemo"));
        Thread thread = new Thread(battle1);

        thread.start();
        Battle battle2 = new Battle(map.get("bh"), map.get("leesin"));
        new Thread(battle2).start();

    }

    /**
     * 使用匿名类的方式创建多线程
     */
    public static void method04() {
        Map<String, Hero> map = initHeros();
        // 使用匿名类创建线程
        Thread thread = new Thread() {
            @Override
            public void run() {
                while (!map.get("teemo").isDead()) {
                    map.get("gareen").attackHero(map.get("teemo"));
                }
            }
        };
        thread.start();

        // 使用匿名内部类 创建线程  lambda表达式的方式
        Thread t2 = new Thread(() -> {
            while (!map.get("leesin").isDead()) {
                map.get("bh").attackHero(map.get("leesin"));
            }
        });
        t2.start();

    }

    public static void main(String[] args) {
        method04();

    }

}
